JasmineJS এর Custom Matchers আপনাকে নিজস্ব matcher তৈরি করার সুযোগ দেয়, যা আপনার টেস্ট কেসের জন্য বিশেষভাবে উপযোগী হতে পারে। Jasmine এ প্রাথমিকভাবে অনেক built-in matcher রয়েছে (যেমন toBe(), toEqual(), toContain()), কিন্তু কখনও কখনও আপনার নিজের বিশেষ matcher তৈরি করতে হতে পারে, যাতে আপনি কাস্টম শর্ত অনুযায়ী ফাংশনালিটি পরীক্ষা করতে পারেন।
Custom Matchers তৈরি করে আপনি আপনার টেস্ট কেসগুলোর মধ্যে আরও নির্দিষ্ট এবং প্রাসঙ্গিক যাচাই করতে পারেন।
Custom Matcher কি?
Custom Matcher হলো একটি বিশেষ matcher যা আপনি নিজের প্রয়োজন অনুযায়ী তৈরি করেন। এটি একটি ফাংশন হবে, যা expect() এর সাথে ব্যবহার করে কাস্টম লজিকের মাধ্যমে কোনো মান যাচাই করে।
Custom Matcher তৈরি করার ধাপ
Jasmine এ Custom Matcher তৈরি করতে expect.extend() মেথড ব্যবহার করতে হয়। এটি Jasmine এর matcher তালিকায় একটি নতুন matcher যুক্ত করে। নতুন matcherটি matchers অবজেক্টে যুক্ত হবে এবং আপনি পরে সেটি expect() এর সাথে ব্যবহার করতে পারবেন।
Custom Matcher তৈরি করার পদ্ধতি
expect.extend() ব্যবহার করে আপনি একটি নতুন matcher তৈরি করতে পারেন। নিচে এর একটি সাধারণ উদাহরণ দেওয়া হলো:
beforeEach(function() {
jasmine.addMatchers({
toBeEven: function() {
return {
compare: function(actual) {
const result = {};
result.pass = actual % 2 === 0;
if (result.pass) {
result.message = `Expected ${actual} to be an even number.`;
} else {
result.message = `Expected ${actual} to be an even number, but it is odd.`;
}
return result;
}
};
}
});
});
এখানে:
toBeEvenএকটি নতুন matcher তৈরি করা হয়েছে যা যাচাই করবে যে কোন সংখ্যা even (যুগল) কিনা।compare()ফাংশনটি matcher এর মূল লজিক। এটিactualমানের সাথে কাজ করে এবং একটি অবজেক্ট রিটার্ন করে, যার মধ্যে:pass: যদি পরীক্ষাটি সফল হয়, তাহলে এটিtrueহবে।message: এটি সেই বার্তা যা টেস্ট ফলাফলের অংশ হিসেবে দেখানো হবে।
Custom Matcher ব্যবহার করা
একবার আপনার custom matcher তৈরি হয়ে গেলে, আপনি সেটি expect() এর সাথে ব্যবহার করতে পারবেন, যেমন Jasmine এর built-in matcher গুলো ব্যবহার করেন।
উদাহরণ:
describe("Custom matcher", function() {
it("should check if a number is even", function() {
expect(4).toBeEven(); // এটি পাস হবে কারণ ৪ একটি even সংখ্যা
expect(5).toBeEven(); // এটি ফেল হবে কারণ ৫ একটি odd সংখ্যা
});
});
এখানে:
toBeEven()matcher টি যাচাই করছে যে ৪ এবং ৫ সংখ্যাগুলি even কিনা।
Custom Matcher এর জন্য আরও উদাহরণ
১. toBeGreaterThanTen Custom Matcher
এই matcher টি যাচাই করবে যে একটি সংখ্যা ১০ এর বেশি কিনা।
beforeEach(function() {
jasmine.addMatchers({
toBeGreaterThanTen: function() {
return {
compare: function(actual) {
const result = {};
result.pass = actual > 10;
if (result.pass) {
result.message = `Expected ${actual} to be greater than 10.`;
} else {
result.message = `Expected ${actual} to be greater than 10, but it is not.`;
}
return result;
}
};
}
});
});
describe("Custom matcher", function() {
it("should check if a number is greater than 10", function() {
expect(15).toBeGreaterThanTen(); // এটি পাস হবে
expect(5).toBeGreaterThanTen(); // এটি ফেল হবে
});
});
২. toContainString Custom Matcher
এই matcher টি একটি স্ট্রিংকে পরীক্ষা করবে যে সেটি অন্য একটি স্ট্রিং ধারণ করছে কি না।
beforeEach(function() {
jasmine.addMatchers({
toContainString: function() {
return {
compare: function(actual, expected) {
const result = {};
result.pass = actual.includes(expected);
if (result.pass) {
result.message = `Expected "${actual}" to contain "${expected}".`;
} else {
result.message = `Expected "${actual}" to contain "${expected}", but it does not.`;
}
return result;
}
};
}
});
});
describe("Custom matcher", function() {
it("should check if a string contains another string", function() {
expect("Hello World").toContainString("Hello"); // এটি পাস হবে
expect("Hello World").toContainString("world"); // এটি ফেল হবে, কারণ "world" lowercase
});
});
এখানে:
toContainString()matcher টি যাচাই করছে যে একটি স্ট্রিং অন্য একটি স্ট্রিং ধারণ করছে কি না, এবং এটি case-sensitive।
Jasmine এর Built-in Matchers এর সাথে Custom Matchers
আপনি Custom Matchers তৈরি করার পর, Jasmine এর অন্যান্য built-in matcher গুলোর সাথে এগুলিকে ব্যবহার করতে পারেন। expect() এর মাধ্যমে অন্যান্য matcher গুলোর সাথে সমন্বিতভাবে এগুলি কাজ করবে।
উদাহরণ:
beforeEach(function() {
jasmine.addMatchers({
toBeGreaterThanFive: function() {
return {
compare: function(actual) {
const result = {};
result.pass = actual > 5;
if (result.pass) {
result.message = `Expected ${actual} to be greater than 5.`;
} else {
result.message = `Expected ${actual} to be greater than 5, but it is not.`;
}
return result;
}
};
}
});
});
describe("Custom matcher", function() {
it("should combine custom matcher with built-in matchers", function() {
expect(10).toBeGreaterThanFive().toBeGreaterThan(8); // এটি পাস হবে
expect(4).toBeGreaterThanFive().toBeLessThan(8); // এটি ফেল হবে
});
});
এখানে:
toBeGreaterThanFive()matcher টি যাচাই করছে যে সংখ্যা ৫ এর বেশি কিনা।- তারপর,
toBeGreaterThan(8)matcher ব্যবহার করা হচ্ছে যাতে যাচাই করা হয় যে সংখ্যাটি ৮ এরও বেশি কিনা।
Custom Matcher এর Limitations
Custom Matchers ব্যবহার করার সময় কিছু সীমাবদ্ধতা হতে পারে, যেমন:
- Error handling: Custom matcher গুলোতে error handling করা কিছুটা tricky হতে পারে, যদি matcher লজিক সঠিকভাবে না লিখে থাকে।
- Performance: খুব complex matcher গুলি টেস্টের পারফরম্যান্সে প্রভাব ফেলতে পারে, বিশেষত বড় টেস্ট স্যুটে।
সারাংশ
JasmineJS এর Custom Matchers ব্যবহার করে আপনি নিজের প্রয়োজন অনুযায়ী matcher তৈরি করতে পারেন, যা আপনার টেস্ট কেসে আরো নির্দিষ্ট যাচাই করতে সহায়তা করে। expect.extend() বা jasmine.addMatchers() ব্যবহার করে আপনি নতুন matcher তৈরি করতে পারেন, এবং এগুলি expect() এর মাধ্যমে সহজেই ব্যবহার করা সম্ভব। Jasmine এর built-in matcher গুলোর সাথে কাস্টম matcher গুলিকে মিশিয়ে আরও শক্তিশালী এবং সূক্ষ্ম টেস্ট কেস তৈরি করা যায়।
Read more